//
//  HMUserInfoModel.swift
//  HMWeiBo
//
//  Created by Apple on 16/7/29.
//  Copyright © 2016年 itheima. All rights reserved.
//

import UIKit


class HMUserInfoModel: NSObject ,NSCoding{

    ///access_token	string	用户授权的唯一票据，用于调用微博的开放接口，同时也是第三方应用验证微博用户登录的唯一票据，第三方应用应该用该票据和自己应用内的用户建立唯一影射关系，来识别登录状态，不能使用本返回值里的UID字段来做登录识别。
    var access_token: String?
    ///expires_in	string	access_token的生命周期，单位是秒数。
    // 实际不是string
    var expires_in: NSTimeInterval = 0{
        // 当我们给过期秒数赋值的时候,把秒数就转换成了 时间
        didSet{
            expires_date = NSDate(timeIntervalSinceNow: expires_in)
        }
        
    }
    
    var expires_date: NSDate?
    
    ///uid	string	授权用户的UID，本字段只是为了方便开发者，减少一次user/show接口调用而返回的，第三方应用不能用此字段作为用户登录状态的识别，只有access_token才是用户授权的唯一票据。
    var uid: String?
    
    
    /// 如果一个模型所对应的属性比较少的话,如果方便可以把它合并到其他的模型里
    ///screen_name	string	用户昵称
    var screen_name: String?
    /// profile_image_url	string	用户头像地址（中图），50×50像素
    var profile_image_url: String?
    
    init(dict: [String: AnyObject]) {
        
        super.init()
        
        setValuesForKeysWithDictionary(dict)
        
    }
    
    // 为了防止崩溃
    override func setValue(value: AnyObject?, forUndefinedKey key: String) {
    }
    
    // 通过归档来把对象保存起来
    
    // 接档 -- 把沙盒里的二进制转换成我们的对象
    // required -- 必须的
    required init?(coder aDecoder: NSCoder) {
        
       self.access_token = aDecoder.decodeObjectForKey("access_token") as? String
       self.expires_date = aDecoder.decodeObjectForKey("expires_date") as? NSDate
        self.uid = aDecoder.decodeObjectForKey("uid") as? String
        self.screen_name = aDecoder.decodeObjectForKey("screen_name") as? String
        self.profile_image_url = aDecoder.decodeObjectForKey("profile_image_url") as? String
        
        //调用一下 父类
        super.init()
        
    }
    
    //归档 把对象以二进制的形式保存到沙盒里
    func encodeWithCoder(aCoder: NSCoder) {
        
        aCoder.encodeObject(access_token, forKey: "access_token")
        aCoder.encodeObject(expires_date, forKey: "expires_date")
        aCoder.encodeObject(uid, forKey: "uid")
        aCoder.encodeObject(screen_name, forKey: "screen_name")
        aCoder.encodeObject(profile_image_url, forKey: "profile_image_url")
    }
    
    // 我们把这个变量 用 static 修饰, 类可以直接访问
    static let userInfoPath = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("aaa.aaa")
    
    //MARK:-- 保存对象到沙盒
    func saveModel() {
        
        // 拼接一个沙盒路径
        // 注意: 是 DocumentDirectory
        // DocumentationDirectory 是mac程序里的路径,在iOS上是不存在的
        
        // 第二个参数;
        
        // Document
        
        
        // func save 属于一个对象方法,所以第一个参数填写 self
        NSKeyedArchiver.archiveRootObject(self, toFile: HMUserInfoModel.userInfoPath)
        
    }
    
    // 返回一个可选的对象
    // 对象方法,创建一个对象才能调用这个方法,我们就是为了得到一个对象,那之前创建的对象是不是没有用?
    // 不创建对象如何调用方法??? 类方法
    
   class func readModel() -> HMUserInfoModel? {
    
    // "expires_in" = 157679999;
    // expires = 10; 11:40:40 -> 11:40:50
      let model =  NSKeyedUnarchiver.unarchiveObjectWithFile(HMUserInfoModel.userInfoPath) as? HMUserInfoModel
    
        // 我们在这里,来判断一下 token的时效
        // 如果 token没有过期,则返回model
        // 如果过期了 则返回 nil
    
    guard let date = model?.expires_date else {
        return nil
    }
    // 未来的时间和当前进行比较 1 9 6
    // 升序 1 6 9
    // 相等
    // 降序 9 6 1
    
    // 2000 & 2016
    // NSDate(timeIntervalSinceNow: 157689999)
    if date.compare(NSDate()) == .OrderedAscending {
        return nil
    } else  if date.compare(NSDate()) == .OrderedSame {
        return nil
    } else {
        return model
    }
    
//        return model
    }
    
}















